package com.wisely.ch8_5.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.wisely.ch8_5.dao.PersonRepository;
import com.wisely.ch8_5.domain.Person;
import com.wisely.ch8_5.service.DemoService;

/**
 * Spring缓存 @CachePut 和 @Cacheable 区别：@CachePut和@Cacheable这两个标签可以结合使用，当需要根据请求改变值的时候，利用@CachePut将值改变并写入到缓存中，而@Cacheable标签除了第一次之外，一直是取的缓存的值。注意结合使用时需要注意两点：
 * 1、必须是同一个缓存实例。
 * 2、key值必须是相同的。
 *
 */
@Service
public class DemoServiceImpl implements DemoService {
	
	@Autowired
	PersonRepository personRepository;

	/**
	 * 1、无论怎样，都会将方法的返回值放到缓存中。@CachePut的属性和@Cacheable保持一致
	 * 2、@CachePut新增的或者是更新的数据到缓存，其中缓存名为people，可为id值。
	 * @param person
	 * @return
	 */
	@Override
	@CachePut(value = "people", key = "#person.id")
	public Person save(Person person) {
		Person p = personRepository.save(person);
		System.out.println("为id、key为:"+p.getId()+"数据做了缓存");
		return p;
	}

	/**
	 * 1、作用@CacheEvict:将一条或多条数据从缓存中删除。
	 * 2、从缓存people中删除key为id的数据。
	 * @param id
	 */
	@Override
	@CacheEvict(value = "people")//2
	public void remove(Long id) {
		System.out.println("删除了id、key为"+id+"的数据缓存");
		//这里不做实际删除操作
	}

	/**
	 * 1、作用@Cacheable("wxCorpByCorpIdAndAgentId")：在findOneBy方法执行前Spring会先查看缓存中是否有数据，如果有数据，则直接返回缓存数据，若没有数据，则调用方法并将方法返回值放进缓存中。
	 *
	 * 2、@Cacheable缓存key为people的id数据到people中。
	 * 注意：如果没有指定key，则方法参数作为key保存到缓存中。
	 * @param person
	 * @return
	 */
	@Override
	@Cacheable(value = "people", key = "#person.id")//3
	public Person findOne(Person person) {
		Person p = personRepository.findOne(person.getId());
		System.out.println("为id、key为:"+p.getId()+"数据做了缓存");
		return p;
	}

}
